package com.base.cn.platform.os.controller.manage.config;

import com.base.cn.platform.os.common.constants.CacheConstants;
import com.base.cn.platform.os.common.constants.ConfigName;
import com.base.cn.platform.os.common.controller.BaseController;
import com.base.cn.platform.os.common.redis.RedisChannel;
import com.base.cn.platform.os.common.utils.ObjectUtils;
import com.base.cn.platform.os.common.utils.StringUtils;
import com.base.cn.platform.os.common.utils.result.ResultUtil;
import com.base.cn.platform.os.entity.manage.config.SysConfig;
import com.base.cn.platform.os.service.manage.config.SysConfigBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * 配置Controller
 *
 * @author s.li
 * @create 2018-04-09-18:33
 */
@RestController
@RequestMapping("/manage")
public class SysConfigController extends BaseController {

    @Autowired
    private SysConfigBiz sysConfigBiz;
    @Autowired
    private RedisChannel redisChannel;

    /**
     * 通过类型标识，获取配置内容
     * @param configKey
     * @return 配置内容
     */
    @RequestMapping("/getSysConfigContext")
    public TreeMap<String, String> getSysConfigContext(@RequestParam("configKey") String configKey){
        return sysConfigBiz.getSysConfigContext(configKey);
    }

    /**
     * 查询配置数据列表
     * @param sysConfig 查询条件
     * @return 配置数据列表
     */
    @RequestMapping("/querySysConfigList")
    public List<SysConfig> querySysConfigList(@RequestBody SysConfig sysConfig){
        return sysConfigBiz.querySysConfigList(sysConfig);
    }
    /**
     * 通过ID，获取配置内容
     * @param id 配置ID
     * @return 配置对象
     */
    @RequestMapping("/getSysConfigById")
    public SysConfig getSysConfigById(@RequestParam("id") BigDecimal id){
        return sysConfigBiz.getSysConfigById(id);
    }
    /**
     * 保存配置数据
     * @param sysConfig 配置数据对象
     * @return SysConfig
     */
    @RequestMapping("/saveConfig")
    public Map<String,Object> saveConfig(@RequestBody SysConfig sysConfig){
        //验证数据
        Map<String,Object> resultMap = this.validationData(sysConfig);
        if(resultMap!=null){
            return resultMap;
        }

        sysConfig = sysConfigBiz.saveConfig(sysConfig);
        return ResultUtil.SUCCESS("配置数据保存成功",sysConfig);
    }

    /**
     * 验证数据
     * @param sysConfig 配置数据对象
     * @return 返回为null则验证通过
     */
    private Map<String,Object> validationData(SysConfig sysConfig){
        String configType = sysConfig.getConfigType();
        Map<String,Object> resultMap = null;
        if(StringUtils.isEmpty(sysConfig.getContext())){
            return ResultUtil.ERROR("配置数据错误");
        }
        TreeMap<String,String> contextMap = sysConfigBiz.contextToMap(sysConfig.getContext());
        if (configType.trim().equals(ConfigName.LOGO)) {//LOGO配置
            String url = contextMap.get("url");
            if(StringUtils.isEmpty(url)){
                return ResultUtil.ERROR("请上传LOGO图片(140px * 84px)");
            }
            String urlSecond = contextMap.get("urlSecond");
            if(StringUtils.isEmpty(urlSecond)){
                return ResultUtil.ERROR("请上传LOGO图片(128px * 128px) ");
            }
        } else if (configType.trim().equals(ConfigName.ICO)) {
            String url = contextMap.get("url");
            if(StringUtils.isEmpty(url)){
                return ResultUtil.ERROR("请上传ICO图片");
            }
        } else if (configType.trim().equals(ConfigName.INFO)) {//网站信息配置 验证
            resultMap = this.vInfo(contextMap);
        } else if (configType.trim().equals(ConfigName.APP)) {//App更新配置
            resultMap = this.vApp(contextMap);
        } else if (configType.trim().equals(ConfigName.APPDOW)) {//App下载二维码
            String url =contextMap.get("url");
            if(StringUtils.isEmpty(url)){
                return ResultUtil.ERROR("请上传App应用下载二维码图片");
            }
            String appHref =contextMap.get("appHref");
            if(StringUtils.isEmpty(appHref)){
                return ResultUtil.ERROR("请填写App应用下载地址");
            }
        } else if (configType.trim().equals(ConfigName.H5AMOBILE)) {//H5&微信二维码
            String url =contextMap.get("url");
            if(StringUtils.isEmpty(url)){
                return ResultUtil.ERROR("请上传H5&微信二维码图片");
            }
        } else if (configType.trim().equals(ConfigName.FREIGHT)) {//运费
            String price = contextMap.get("price");
            if(StringUtils.isEmpty(price)){
                return ResultUtil.ERROR("请填写运费");
            }
            if(!StringUtils.isNumber(price)){
                return ResultUtil.ERROR("运费必须是正整数");
            }
        } else if (configType.trim().equals(ConfigName.ATTENT)) {//旁听分成
            resultMap = vAttent(contextMap);
        } else if (configType.trim().equals(ConfigName.SMALLAPP)) {//小程序二维码
            String url =contextMap.get("url");
            if(StringUtils.isEmpty(url)){
                return ResultUtil.ERROR("请上传小程序码图片");
            }
        } else if (configType.trim().equals(ConfigName.SMS)) {//短信配置
            resultMap = this.vSms(contextMap);
        } else if (configType.trim().equals(ConfigName.EMAIL)) {//验证服务邮箱数据
            resultMap = this.vEmail(contextMap);
        } else if (configType.trim().equals(ConfigName.V96K)) {//验证96K配置数据
            //96k配置为系统自动配置无需验证
            //resultMap = this.v96k(contextMap);
        } else if (configType.trim().equals(ConfigName.SERVICE)) {//客服链接配置
            String context = contextMap.get("context");
            if(StringUtils.isEmpty(context)){
                return ResultUtil.ERROR("请填写链接内容");
            }
        }else if (configType.trim().equals(ConfigName.COUNTCODE)) {//第三方代码统计
            String code = contextMap.get("code");
            if(StringUtils.isEmpty(code)){
                return ResultUtil.ERROR("请填写第三方统计代码内容");
            }
            String mateCode = contextMap.get("mateCode");
            String statisticsOnOffSwitch = contextMap.get("statisticsOnOffSwitch");
            if(statisticsOnOffSwitch.equalsIgnoreCase("on") && StringUtils.isEmpty(mateCode)){
                return ResultUtil.ERROR("请填写对应配置参数内容");
            }
        } else if (configType.trim().equals(ConfigName.WEIXINAPP)) {//微信小程序配置验证
            resultMap = this.vWeiXinApp(contextMap);
        } else if (configType.trim().equals(ConfigName.QQLOGIN)) {
            resultMap = this.vQQLogin(contextMap);
        } else if (configType.trim().equals(ConfigName.WXLOGIN)) {
            resultMap = this.vWXLogin(contextMap);
        } else if(configType.trim().equals(ConfigName.PROTOCOL)){//用户注册协议
            resultMap = this.vProtocol(contextMap);
        }
        else if(configType.trim().equals(ConfigName.PIVACY)){//用户注册协议
            resultMap = this.vPivacy(contextMap);
        }
        else if(configType.trim().equals(ConfigName.INITID)){
            resultMap = this.VInitId(contextMap);
        }
        else if(configType.trim().equals(ConfigName.WECHATSERVICE)){
            resultMap = this.vWechatService(contextMap);
        }
        else if(configType.trim().equals(ConfigName.COURSESERVICE)){
            String serviceCourseContent = contextMap.get("serviceCourseContent");
            String[] split = serviceCourseContent.split(",");
            if(split.length>3){
                return ResultUtil.ERROR("最多设置3个关键字");
            }
            for(int i =0;i<split.length;i++){
                if(split[i].trim().length()>6){
                    return ResultUtil.ERROR("第"+(i+1)+"关键字大于6个字");
                }
            }
        }
        if(ObjectUtils.isNotEmpty(resultMap)){
            return resultMap;
        }
        if(StringUtils.isEmpty(sysConfig.getDepict())&&!ConfigName.WECHATSERVICE.equals(sysConfig.getConfigType())){
            return ResultUtil.ERROR("请填写配置内容说明");
        }
        return null;
    }

    /**
     *通过配置类型获取配置信息
     * @param configType  配置类型
     * @return 配置数据列表
     */
    @RequestMapping("/getSysConfigByConfigType")
    public SysConfig getSysConfigByConfigType(@RequestParam("configType") String configType){
        return sysConfigBiz.getSysConfigByConfigType(configType  );
    }
    /**
     * 验证微信登录配置数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> vWXLogin(TreeMap<String, String> contextMap) {
        if(StringUtils.isEmpty(contextMap.get("appId"))){
            return ResultUtil.ERROR("请填写微信公众平台appId");
        }
        if(StringUtils.isEmpty(contextMap.get("appSecret"))){
            return ResultUtil.ERROR("请填写微信公众平台secret");
        }
        if(StringUtils.isEmpty(contextMap.get("pcOpenAppId"))){
            return ResultUtil.ERROR("请填写微信开放平台PC应用appId");
        }
        if(StringUtils.isEmpty(contextMap.get("pcOpenSecret"))){
            return ResultUtil.ERROR("请填写微信开放平台PC应用secret");
        }
        if(StringUtils.isEmpty(contextMap.get("pcUrl"))){
            return ResultUtil.ERROR("请填写PC回调路径");
        }
        if(StringUtils.isEmpty(contextMap.get("mobileUrl"))){
            return ResultUtil.ERROR("请填写H5回调路径");
        }
        return null;
    }

    /**
     * 验证用户注册协议
     * @param contextMap
     * @return
     */
    private Map<String,Object> vProtocol(TreeMap<String, String> contextMap){
        if(StringUtils.isEmpty(contextMap.get("content"))){
            return ResultUtil.ERROR("请填写用户注册协议内容");
        }
        return null;
    }
    /**
     * 验证用户注册协议
     * @param contextMap
     * @return
     */
    private Map<String,Object> vPivacy(TreeMap<String, String> contextMap){
        if(StringUtils.isEmpty(contextMap.get("content"))){
            return ResultUtil.ERROR("用户隐私协议");
        }
        return null;
    }

    /**
     * 验证QQ登录配置数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> vQQLogin(TreeMap<String, String> contextMap) {
        if(StringUtils.isEmpty(contextMap.get("appId"))){
            return ResultUtil.ERROR("请填写QQ互联平台应用appId");
        }
        if(StringUtils.isEmpty(contextMap.get("appKey"))){
            return ResultUtil.ERROR("请填写QQ互联平台应用appKey");
        }
        if(StringUtils.isEmpty(contextMap.get("pcUrl"))){
            return ResultUtil.ERROR("请填写PC回调路径");
        }
        if(StringUtils.isEmpty(contextMap.get("mobileUrl"))){
            return ResultUtil.ERROR("请填写H5回调路径");
        }
        return null;
    }

    /**
     * 验证微信小程序数据配置
     * @param contextMap
     * @return
     */
    private Map<String,Object> vWeiXinApp(TreeMap<String, String> contextMap) {
        if(StringUtils.isEmpty(contextMap.get("appId"))){
            return ResultUtil.ERROR("请填写小程序AppId");
        }
        if(StringUtils.isEmpty(contextMap.get("secret"))){
            return ResultUtil.ERROR("请填写小程序secret");
        }
        return null;
    }

    /**
     * 验证96K数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> v96k(TreeMap<String, String> contextMap) {

        if(contextMap.get("concurrentLive").equals("true")){
            if(StringUtils.isEmpty(contextMap.get("c_auth_id"))){
                return ResultUtil.ERROR("请填写并发直播鉴权ID");
            }
            if(StringUtils.isEmpty(contextMap.get("c_auth_key"))){
                return ResultUtil.ERROR("请填写并发直播鉴权密码");
            }
        }
        if(contextMap.get("personTimeLive").equals("true")){
            if(StringUtils.isEmpty(contextMap.get("p_auth_id"))){
                return ResultUtil.ERROR("请填写人次直播鉴权ID");
            }
            if(StringUtils.isEmpty(contextMap.get("p_auth_key"))){
                return ResultUtil.ERROR("请填写人次直播鉴权密码");
            }
        }
        if(contextMap.get("interactiveLive").equals("true")){
            if(StringUtils.isEmpty(contextMap.get("i_auth_id"))){
                return ResultUtil.ERROR("请填写互动直播鉴权ID");
            }
            if(StringUtils.isEmpty(contextMap.get("i_auth_key"))){
                return ResultUtil.ERROR("请填写互动直播鉴权密码");
            }
        }
        if(StringUtils.isEmpty(contextMap.get("customerKey"))){
            return ResultUtil.ERROR("请填写鉴权密钥");
        }
        if(StringUtils.isEmpty(contextMap.get("serviceUseInfoUrl"))){
            return ResultUtil.ERROR("请填写流量统计URL");
        }
        if(StringUtils.isEmpty(contextMap.get("serviceUrl"))){
            return ResultUtil.ERROR("请填写服务信息URL");
        }
        if(StringUtils.isEmpty(contextMap.get("createLiveUrl"))){
            return ResultUtil.ERROR("请填写创建直播URL");
        }
        if(StringUtils.isEmpty(contextMap.get("createVideoUrl"))){
            return ResultUtil.ERROR("请填写创建录播URL");
        }
        if(StringUtils.isEmpty(contextMap.get("batchCreateVideoUrl"))){
            return ResultUtil.ERROR("请填写批量上传音频/视频URL");
        }
        if(StringUtils.isEmpty(contextMap.get("playback"))){
            return ResultUtil.ERROR("请填写直播回放接口URL");
        }
        if(StringUtils.isEmpty(contextMap.get("deleteVideo"))){
            return ResultUtil.ERROR("请填写删除录播接口URL");
        }
        if(StringUtils.isEmpty(contextMap.get("close"))){
            return ResultUtil.ERROR("请填写关闭直播接口URL");
        }
        if(StringUtils.isEmpty(contextMap.get("demand"))){
            return ResultUtil.ERROR("请填写录播列表接口URL");
        }
        if(StringUtils.isEmpty(contextMap.get("live"))){
            return ResultUtil.ERROR("请填写直播列表接口URL");
        }
        if(StringUtils.isEmpty(contextMap.get("client"))){
            return ResultUtil.ERROR("请填写客户端直播接口URL");
        }
        return null;
    }

    /**
     * 验证短信配置数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> vSms(TreeMap<String, String> contextMap) {
        if(ObjectUtils.isEmpty(contextMap.get("serviceName"))||contextMap.get("serviceName").equals("CSY")){
            if(StringUtils.isEmpty(contextMap.get("AppKey"))){
                return ResultUtil.ERROR("请填写AppKey");
            }
        }
        if(StringUtils.isEmpty(contextMap.get("appSecret"))){
            return ResultUtil.ERROR("请填写appSecret");
        }
        if(StringUtils.isEmpty(contextMap.get("appId"))){
            return ResultUtil.ERROR("请填写appId");
        }
        if(StringUtils.isEmpty(contextMap.get("sig"))){
            return ResultUtil.ERROR("短信签名不能为空");
        }
        return null;
    }

    /**
     * 验证邮箱数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> vEmail(TreeMap<String, String> contextMap) {
        if(StringUtils.isEmpty(contextMap.get("emailUsername"))){
            return ResultUtil.ERROR("请填写服务邮箱账号");
        }
        if(StringUtils.isEmpty(contextMap.get("emailPassword"))){
            return ResultUtil.ERROR("请填写服务邮箱密码");
        }
        if(StringUtils.isEmpty(contextMap.get("emailHost"))){
            return ResultUtil.ERROR("请填写服务邮箱协议");
        }
        if(StringUtils.isEmpty(contextMap.get("port"))){
            return ResultUtil.ERROR("请填写发送端口");
        }else{
            if(!StringUtils.isNumber(contextMap.get("port"))){
                return ResultUtil.ERROR("端口必须是正整数");
            }
        }
        return null;
    }

    /**
     * 验证分成数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> vAttent(TreeMap<String, String> contextMap) {
        String sys = (String)contextMap.get("sysTerrace");
        String user = (String)contextMap.get("user");
        String teacher = (String)contextMap.get("teacher");
        if(!StringUtils.isNumber(sys) ){
            return ResultUtil.ERROR("平台分成比例必须是正整数");
        }
        if(!StringUtils.isNumber(user)){
            return ResultUtil.ERROR("用户分成比例必须是正整数");
        }
        if(!StringUtils.isNumber(teacher)){
            return ResultUtil.ERROR("讲师分成比例必须是正整数");
        }
        if((Integer.parseInt(sys)+Integer.parseInt(user)+Integer.parseInt(teacher))!=10){
            return ResultUtil.ERROR("三个分成比例总和必须等于10");
        }
        String refundSwitch = (String)contextMap.get("refundSwitch");
        String refundTime = (String)contextMap.get("refundTime");
        if (refundSwitch.equals("ON") && !StringUtils.isNumber(refundTime)){
            return ResultUtil.ERROR("退费时间必须是整数");
        }
        return null;
    }

    /**
     * 网站信息配置验证
     * @param context 配置内容
     * @return
     */
    private Map<String,Object> vApp(TreeMap<String, String> context) {
        if(StringUtils.isEmpty(context.get("anUrl")) && context.get("anUrlRadio").equals("nativeUrl")){
            return ResultUtil.ERROR("请上传Android更新包");
        }
        if(StringUtils.isEmpty(context.get("anUrl")) && context.get("anUrlRadio").equals("appStoreUrl")){
            return ResultUtil.ERROR("请填写Android更新包下载路径");
        }
        if(StringUtils.isEmpty(context.get("anVersion"))){
            return ResultUtil.ERROR("请填写Android版本号");
        }
        if(StringUtils.isEmpty(context.get("anDepict"))){
            return ResultUtil.ERROR("请填写Android更新描述");
        }
        if(StringUtils.isEmpty(context.get("iosUrl"))){
            return ResultUtil.ERROR("IOS更新包下载路径");
        }
        if(StringUtils.isEmpty(context.get("iosVersion"))){
            return ResultUtil.ERROR("请填写IOS版本号");
        }
        if(StringUtils.isEmpty(context.get("iosDepict"))){
            return ResultUtil.ERROR("请填写IOS更新描述");
        }
        return null;
    }

    /**
     * 网站信息配置验证
     * @param context 配置内容
     * @return
     */
    private Map<String,Object> vInfo(TreeMap<String,String> context){
        if(StringUtils.isEmpty(context.get("title"))){
            return ResultUtil.ERROR("请填写网站title(网站头部)");
        }
        if(StringUtils.isEmpty(context.get("appName"))){
            return ResultUtil.ERROR("请填APP名称");
        }
        if(StringUtils.isEmpty(context.get("tagline"))){
            return ResultUtil.ERROR("请填写标语");
        }
        if(StringUtils.isEmpty(context.get("company"))){
            return ResultUtil.ERROR("请填写运营机构名");
        }
        if(StringUtils.isEmpty(context.get("author"))){
            return ResultUtil.ERROR("请填写网站作者");
        }
        if(StringUtils.isEmpty(context.get("keywords"))){
            return ResultUtil.ERROR("请填网站关键词");
        }
        if(StringUtils.isEmpty(context.get("description"))){
            return ResultUtil.ERROR("请填网站描述信息");
        }
        if(StringUtils.isEmpty(context.get("email"))){
            return ResultUtil.ERROR("请填写工作邮箱");
        }
        if(StringUtils.isEmpty(context.get("phone"))){
            return ResultUtil.ERROR("请填写热线电话");
        }
        if(StringUtils.isEmpty(context.get("workTime"))){
            return ResultUtil.ERROR("请填写工作时间");
        }
        if(StringUtils.isEmpty(context.get("copyright"))){
            return ResultUtil.ERROR("请填写版权以及备案号(网站底部)");
        }
        return null;
    }

    /**
     * 验证初始化数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> VInitId(TreeMap<String, String> contextMap){
        if(StringUtils.isEmpty(contextMap.get("initNum"))){
            return ResultUtil.ERROR("请填写要初始化的数量");
        }
        String initNum = contextMap.get("initNum");
        if(Long.valueOf(initNum)<=4000){
            return ResultUtil.ERROR("初始值必须大于4000");
        }
        //检查是否初始化过 初始化后不可修改稿
        TreeMap<String, String> sysConfigContext = sysConfigBiz.getSysConfigContext(ConfigName.INITID);
        if(ObjectUtils.isNotEmpty(sysConfigContext)){
            return ResultUtil.ERROR("已初始化过不可进行初始化");
        }
        //检擦通过初始化
        redisChannel.setInitId(CacheConstants.ID,Long.valueOf(initNum));
        return null;
    }

    /**
     * 验证初始化数据
     * @param contextMap
     * @return
     */
    private Map<String,Object> vWechatService(TreeMap<String, String> contextMap){
        if(contextMap.get("serviceSwitch").equals("ON")){
            if(StringUtils.isEmpty(contextMap.get("url"))){
                return ResultUtil.ERROR("请上传微信公众号二维码");
            }
        }
        return null;
    }
}
